/**
 * Author:  zhzhy.
 * Date:    2018/7/27.
 * File：  post
 */
import * as axios from 'axios'
import getHead from './getHead'
import {getErrorCn} from './errorMap'
import {isEmptyObject} from '../util'
import {Message} from 'element-ui'

/**
 * 基于axios,自定义的post方法
 * @param type oauth/inner/outer
 * @param url
 * @param data
 * @returns {Promise}
 */
async function post (type, url, data) {
  let proxyUrl
  switch (type) {
    case 'inner':
      proxyUrl = 'http://172.30.0.240:9300'
      break
    case 'oauth':
    case 'outer':
    default:
      proxyUrl = window.localStorage.getItem('serverHost') + url
      break
  }
  let head = await getHead(type, data, url)
  return new Promise((resolve, reject) => {
    axios.post(proxyUrl, data, {headers: head}).then(function (response) {
      if (type === 'inner') {
        let str = response.data.replace(/\+/g, '%20')// 解决空格变成加号的问题
        response.data = decodeURIComponent(str)
        response.data = response.data.replace(/\t/g, '')// 解决制表符影响json解析的问题
      }
      if (/ERR_/.test(response.data)) {
        var errorJson = JSON.parse(response.data.replace('ERR_{', '{'))
        // 判断是否超时，跳转到登录
        if (errorJson.code === '3004') {
          Message({
            type: 'error',
            message: '登录超时，请重新登录！',
            duration: 1400
          })
        }
        let errorCn = getErrorCn(errorJson.code)
        if (errorCn) {
          errorJson.msg = errorCn
        }
        reject(errorJson)
      }
      if (!isEmptyObject(response.data)) {
        // 由于接口设计问题，部分错误会返回一个 ERR_开头的异常信息字符串,如：ERR_{code:'',msg:''}
        if (/ERR_/.test(response.data)) {
          let errorJson = JSON.parse(response.data.replace('ERR_{', '{'))
          // 将英文错误提示映射为中文
          let errorCn = getErrorCn(errorJson.code)
          if (errorCn) {
            errorJson.msg = errorCn
          }
          reject(errorJson)
        } else if (response.data == null || response.data === '') {
          reject(console.log(new Error({code: '4040', msg: '请求无响应'})))
        } else {
          let responseData = response.data
          // 同时出现code与msg,说明服务端响应的是异常信息
          if (typeof responseData.code !== 'undefined' && typeof responseData.msg !== 'undefined') {
            // 将英文错误提示映射为中文
            let errorCn = getErrorCn(responseData.msg)
            if (errorCn) {
              responseData.msg = errorCn
            }
            reject(responseData)
          } else {
            // 正常响应处理
            resolve(typeof responseData === 'string' ? JSON.parse(responseData) : responseData)
          }
        }
      } else {
        resolve(response.data)
      }
    }).catch(function (error) {
      console.error('请求服务器发生错误：')
      console.error(error)
      reject(error)
    })
  })
}
// module.exports = post
export default post
